#include <stdio.h>
#include <stdlib.h>

// 定义红黑树颜色枚举
typedef enum { RED, BLACK } Color;

// 红黑树节点结构
typedef struct Node {
    int data;
    Color color;
    struct Node *left;
    struct Node *right;
    struct Node *parent;  // 可选，用于复杂操作
} Node;

// 创建新节点（默认为红色）
Node* create_node(int data, Color color) {
    Node *node = (Node*)malloc(sizeof(Node));
    node->data = data;
    node->color = color;
    node->left = node->right = NULL;
    return node;
}


// 递归生成 DOT 描述（标记颜色）
void generate_rbtree_dot(Node *root, FILE *file) {
    if (root == NULL) return;

    // 定义当前节点的颜色和样式
    const char *color = (root->color == RED) ? "red" : "black";
    fprintf(file, "  %d [label=\"%d\", fillcolor=\"%s\", style=filled, fontcolor=white];\n",
            root->data, root->data, color);

    // 左子节点和边
    if (root->left != NULL) {
        fprintf(file, "  %d -> %d;\n", root->data, root->left->data);
        generate_rbtree_dot(root->left, file);
    }

    // 右子节点和边
    if (root->right != NULL) {
        fprintf(file, "  %d -> %d;\n", root->data, root->right->data);
        generate_rbtree_dot(root->right, file);
    }
}

int rbtree_test_init(void);

// 主函数生成 DOT 文件
int main() {
    // 示例红黑树结构（手动构建，仅用于演示）
    Node *root = create_node(10, BLACK);
    root->left = create_node(5, RED);
    root->right = create_node(30, RED);
    root->left->left = create_node(2, BLACK);
    root->left->right = create_node(8, BLACK);
    root->right->left = create_node(25, BLACK);

    // 生成 DOT 文件
    FILE *file = fopen("plot_rbtree.dot", "w");
    fprintf(file, "digraph RedBlackTree {\n");
    fprintf(file, "  node [shape=circle, penwidth=2];\n");  // 统一节点样式
    generate_rbtree_dot(root, file);
    fprintf(file, "}\n");
    fclose(file);

    // 调用 Graphviz 生成 PNG 图片
    system("dot -Tpng plot_rbtree.dot -o plot_rbtree.png");

    rbtree_test_init();

    return 0;
}
